//构造函数实现通用属性和方法，new实例方法继承构造函数的属性和方法
function SuperFun (name,age) {
    // 公共的属性
    this.name = name
    this.age = age
    this.has = ['头发','眼睛','鼻子']
}
// 公共方法
SuperFun.prototype.getSuperValue = function () {
    console.log('都有'+this.has);
    console.log(this.age+'岁'+this.name+'在晨跑锻炼');
}
let huahua = new SuperFun('花花',23)
huahua.getSuperValue()
huahua.has.push('耳朵')
console.log(...huahua.has); //头发 眼睛 鼻子 耳朵
let ming = new SuperFun('明明',21)
ming.getSuperValue()
ming.has.push('嘴巴')
console.log(...ming.has); //头发 眼睛 鼻子 嘴巴

// 原型链继承，其实就是通过prototype原型属性的方式继承父类
function SubFun (name,age) {
     // 公共的属性
     this.name = name
     this.age = age
    // //  通过拷贝父类属性
    // SuperFun.call(this,name,age)
}
SubFun.prototype = new SuperFun()  //原型链继承
// 实例对象
let zhangsan = new SubFun('张三',11)
zhangsan.getSuperValue()  //都有头发,眼睛,鼻子
zhangsan.has.push('大长腿')
console.log(...zhangsan.has); //头发 眼睛 鼻子 大长腿

let lisi = new SubFun('李四',10)
lisi.getSuperValue()  //都有头发,眼睛,鼻子,大长腿
lisi.has.push('乌黑头发')
console.log(...lisi.has); //头发 眼睛 鼻子 大长腿 乌黑头发
// 原型链方案存在的缺点：多个实例对引用类型的操作会被篡改。

// 解决方案：使用组合继承，原型链继承结合构造函数继承
// 在子构造函数中使用  通过拷贝父类属性
    // SuperFun.call(this,name,age)